home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 163_01 / cc11.c < prev    next >
Text File  |  1991-01-05  |  13KB  |  463 lines

  1. /*
  2. ** execution begins here
  3. */
  4. #ifdef CMD_LINE
  5. main(argc, argv) int argc, *argv; {
  6.   argcs=argc;
  7.   argvs=argv;
  8. #else
  9. main() {
  10. #endif
  11.   sout("Small-C Version 2.0 for the IBM PC -- Release 1.01\n", stderr);
  12.   sout("Portions Copyright 1982 by J. E. Hendrix\n", stderr);
  13.   sout("Converted to the IBM PC by D. R. Hicks\n", stderr);
  14.   sout("\n", stderr);
  15. #ifdef DYNAMIC
  16.   swnext=malloc(SWTABSZ);
  17.   swend=swnext+((SWTABSZ-SWSIZ)>>1);
  18.   stage=malloc(STAGESIZE);
  19.   stagelast=stage+STAGELIMIT;
  20.   wq=malloc(WQTABSZ*BPW);
  21.   litq=malloc(LITABSZ);
  22. #ifdef HASH
  23.   macn=malloc(MACNSIZE);
  24.   cptr=macn-1;
  25.   while(++cptr < MACNEND) *cptr=0;
  26. #endif
  27.   macq=malloc(MACQSIZE);
  28.   pline=malloc(LINESIZE);
  29.   mline=malloc(LINESIZE);
  30. #else
  31.   swend=(swnext=swq)+SWTABSZ-SWSIZ;
  32.   stagelast=stage+STAGELIMIT;
  33. #endif
  34.   swactive=         /* not in switch                         */
  35.   stagenext=        /* direct output mode                    */
  36.   iflevel=          /* #if... nesting level =0               */
  37.   skiplevel=        /* #if... not encountered                */
  38.   macptr=           /* clear the macro pool                  */
  39.   csp =             /* stack ptr (relative)                  */
  40.   errcnt=           /* number of errors flagged              */
  41.   errflag=0;        /* not skipping errors till ";"          */
  42.   eof=              /* not eof yet                           */
  43.   ncmp=             /* not in compound statement             */
  44.   dmode=            /* not in DATASEG                        */
  45.   files=
  46.   filearg=
  47.   nxtlab=
  48.   quote[1]=0;
  49.   ccode=1;          /* enable preprocessing                  */
  50.   wqptr=wq;         /* clear while queue                     */
  51.   quote[0]='"';     /* fake a quote literal                  */
  52.   input=input2=EOF;
  53.   ask();            /* get user options                      */
  54.   sout("\n", stderr); /* blank line to separate options from listing */
  55.   kill(); /* reset input buffer prior to first read */
  56.   preprocess();     /* fetch first line                      */
  57. #ifdef DYNAMIC
  58. #ifdef HASH
  59.   symtab=malloc(NUMLOCS*SYMAVG + NUMGLBS*SYMMAX);
  60. #else
  61.   symtab=malloc(NUMLOCS*SYMAVG);
  62.   /* global space is allocated with each new entry           */
  63. #endif
  64. #endif
  65. #ifdef HASH
  66.   cptr=STARTGLB-1;
  67.   while(++cptr < ENDGLB) *cptr=0;
  68. #endif
  69.   glbptr=STARTGLB;
  70.   glbflag=1;
  71.   header();         /* intro code */
  72.   setops();         /* set values in op arrays */
  73.   parse();          /* process ALL values */
  74.   outside();        /* verify outside any function */
  75.   externs();        /* declare all externals to the assembler */
  76.   trailer();        /* follow-up code */
  77.   if(output != stdout) fclose(output);
  78.   summary();        /* print error summary */
  79.   }
  80.  
  81. /*
  82. ** process all input text
  83. **
  84. ** At this level, only static declarations.
  85. **       defines, includes and function
  86. **       definitions are legal ...
  87. */
  88. parse() {
  89.   while (eof==0) {
  90.     if(amatch("extern", 6))       dodeclare(EXTERNAL);
  91.     else if(amatch("static", 6))  dodeclare(STATIC);
  92.     else if(dodeclare(PUBLIC))    ;
  93.     else if(match("#asm"))        doasm();
  94.     else if(match("#include"))    doinclude();
  95.     else if(match("#define"))     addmac();
  96.     else                          newfunc(PUBLIC);
  97.     blanks();      /* force eof if pending                   */
  98.     }
  99.   }
  100.  
  101. /*
  102. ** dump the literal pool
  103. */
  104. dumplits(size) int size;  {
  105.   int j, k;
  106.   k=0;
  107.   while (k<litptr)  {
  108.     defstorage(size);
  109.     j=10;
  110.     while(j--) {
  111.       outdec(getint(litq+k, size));
  112.       k=k+size;
  113.       if ((j==0) | (k>=litptr))  {
  114.         nl();
  115.         break;
  116.         }
  117.       outbyte(',');
  118.       }
  119.     }
  120.   }
  121. /*
  122. ** dump zeroes for default initial values
  123. */
  124. dumpzero(size, count) int size, count; {
  125.   int j;
  126.   while (count > 0) {
  127.     defstorage(size);
  128.     count = genzeros(count); /* generate literal zeros */
  129.     }
  130.   }
  131. /*
  132. ** verify compile ends outside any function
  133. */
  134. outside()  {
  135.   if (ncmp) error("no closing bracket");
  136.   }
  137.  
  138. /*
  139. ** get run options
  140. */
  141. ask() {
  142.   int defin, defout, deflist, defi, defm, defa, defp;
  143.   int dftin, dftout, dftlist;
  144.   char inname[81], outname[81], listname[81];
  145. #ifdef CMD_LINE
  146.   int argnum, truth;
  147.   char *ptr;
  148. #endif
  149.   defin = defout = deflist = defi = defm = defa = defp = 0;
  150.   dftin = dftout = dftlist = 1;
  151.   ctext = monitor = alarm = pause = 1;
  152.   input = stdin;
  153.   output = stdout;
  154.   listfp=0;
  155.   strcpy(inname, "con.C");
  156.   strcpy(outname, "con.ASM");
  157.   strcpy(listname, "NUL.LST");
  158. #ifdef CMD_LINE
  159.   argnum = 1;
  160.   while(argnum < argcs) {
  161.     ptr = argvs[argnum++]; /* cast arg as char * */
  162.     if(*ptr == ';') { /* if defaults to be taken */
  163.       defin = defout = deflist = defi = defm = defa = defp = 1;
  164.       break;
  165.       }
  166.     else if(*ptr != '-') { /* if file name */
  167.       if(!defin) {
  168.         if(*ptr != ',') {
  169.           joinname(inname, ptr);
  170.           dupename(outname, inname);
  171.           dftin = 0;
  172.           dftout = 0;
  173.           }
  174.         defin = 1;
  175.         }
  176.       else if(!defout) {
  177.         if(*ptr != ',') {
  178.           joinname(outname, ptr);
  179.           dftout = 0;
  180.           }
  181.         defout = 1;
  182.         }
  183.       else if(!deflist) {
  184.         if(*ptr != ',') {
  185.           joinname(listname, ptr);
  186.           dftlist = 0;
  187.           }
  188.         deflist = 1;
  189.         }
  190.       else {
  191.         fprintf(stderr, "ERROR:  Extraneous parameter %s\n", ptr);
  192.         errcnt++;
  193.         }
  194.       }
  195.     else { /* must be option */
  196.       ptr++; /* skip "-" */
  197.       truth = 1;
  198.       if(upper(*ptr) == 'N') {
  199.         truth = 0;
  200.         ptr++;
  201.         }
  202.       switch(upper(*ptr)) {
  203.         case 'I': { /* interleave C source */
  204.           ctext = truth;
  205.           defi = 1;
  206.           break;
  207.           }
  208.         case 'M': { /* monitor function headers */
  209.           monitor = truth;
  210.           defm = 1;
  211.           break;
  212.           }
  213.         case 'A': { /* sound alarm on errors */
  214.           alarm = truth;
  215.           defa = 1;
  216.           break;
  217.           }
  218.         case 'P': { /* pause on errors */
  219.           pause = truth;
  220.           defp = 1;
  221.           break;
  222.           }
  223.         default:
  224.           fprintf(stderr, "ERROR:  Extraneous option -%c\n", *ptr);
  225.           errcnt++;
  226.         }
  227.       }
  228.     }
  229. #endif
  230.   line=mline; /* use macro buffer for kbd buffer */
  231.   if(!defin) {
  232.     fprintf(stdout, "Input filename [%s]: ", inname);
  233.     if(prompt("", line, LINESIZE)) {
  234.       joinname(inname, line);
  235.       dupename(outname, inname);
  236.       dftin = 0;
  237.       }
  238.     }
  239.   if(!defout) {
  240.     fprintf(stdout, "Output filename [%s]: ", outname);
  241.     if(prompt("", line, LINESIZE)) {
  242.       joinname(outname, line);
  243.       dftout = 0;
  244.       }
  245.     }
  246.   if(!deflist) {
  247.     fprintf(stdout, "Listing filename [%s]: ", listname);
  248.     if(prompt("", line, LINESIZE)) {
  249.       joinname(listname, line);
  250.       dftlist = 0;
  251.       }
  252.     }
  253.   while(!defi) {
  254.     prompt("Interleave C source? ", line, LINESIZE);
  255.     if(upper(*line)=='Y') ctext=YES;
  256.     else if(upper(*line)!='N') continue;
  257.     defi = 1;
  258.     }
  259.   if((!defm) && dftout) { /* don't monitor if output to con */
  260.     monitor = 0;
  261.     defm = 1;
  262.     }
  263.   while(!defm) {
  264.     prompt("Monitor function headers? ", line, LINESIZE);
  265.     if(upper(*line)=='Y') monitor=YES;
  266.     else if(upper(*line)!='N') continue;
  267.     defm = 1;
  268.     }
  269.   while(!defa) {
  270.     prompt("Sound alarm on errors? ", line, LINESIZE);
  271.     if(upper(*line)=='Y') alarm=YES;
  272.     else if(upper(*line)!='N') continue;
  273.     defa = 1;
  274.     }
  275.   while(!defp) {
  276.     prompt("Pause on errors? ", line, LINESIZE);
  277.     if(upper(*line)=='Y') pause=YES;
  278.     else if(upper(*line)!='N') continue;
  279.     defp = 1;
  280.     }
  281.   if(!dftin) {
  282.     input=fopen(inname,"r");
  283.     if(!input) {
  284.       fprintf(stderr, "ERROR: Cannot open %s for input\n", inname);
  285.       exit(errno);
  286.       }
  287.     }
  288.   if(!dftout) {
  289.     output=fopen(outname,"w");
  290.     if(!output) {
  291.       fprintf(stderr, "ERROR: Cannot open %s for output\n", outname);
  292.       exit(errno);
  293.       }
  294.     }
  295.   if(!dftlist) {
  296.     listfp=fopen(listname,"w");
  297.     if(!listfp) {
  298.       fprintf(stderr, "